/**
 * @author hp by 2018-06-05
 * @type {api}
 * @echarts3Map 对外GIS API
 */
function  TMap_Api()
{
    var _this = this; //设置当前函数的全局对象
    var path = getRootPath(); //获取项目根目录

    /**
     * @param 业务数据
     * @divId echarts容器id
     * @options map参数对象
     * @该接口主要实现地图下钻区域渲染或散点图等
     */
    _this.loadMapUnder = function(param,divId,options)
    {
        //存储切换的每一级地图信息
        var mapStack = [];
        var timeFn = null;
        var curMap = {};
        // 初始化echarts示例mapChart
        if(divId != "")
        {
            var mapChart = echarts.init(document.getElementById(divId));
        }
        /*
        * 读取echarts Option配置数据
        */
        // echarts配置json文件的地址
        var optionUrl = path + "/config/china_map.json";
        // 读取echartsoption配置
        $.get(optionUrl, function (option)
        {
            if(option != null)
            {
                mapOption = option;
                if(param != null)
                {
                    var businessData = param.chinaData;
                    getMap("100000", "china", businessData);
                }
            }
        });

        /**
         * @param mapCode
         * @param mapName
         * @param businessData
         * @getMap 注册地图到echarts容器
         */
        function getMap(mapCode,mapName,businessData)
        {
            mapChart.showLoading();// 数据加载项，增强用户体验
            // 地图json文件的地址
            var mapUrl = options.mapUrl + mapCode+".json";
            // 读取geo地图数据
            $.get(mapUrl, function (json)
            {
                if(json != null)
                {
                    echarts.registerMap(mapName, json); //注册地图
                    mapOption.series[0].data = businessData; //设置业务数据
                    mapOption.series[0].mapType = mapName; //设置地图类型
                    mapChart.setOption(mapOption);
                    curMap =
                    {
                        mapCode: mapCode,
                        mapName: mapName
                    };
                    mapChart.hideLoading();// 数据加载项，增强用户体验
                }
            });
        };

        /**
         绑定用户切换地图区域事件
         cityMap对象存储着地图区域名称和区域的信息(name-code)
         当mapCode有值,说明可以切换到下级地图
         同时保存上级地图的编号和名称
         */
        var flag = 0;// 二级三级地图切换
        mapChart.on("mapselectchanged", function(params) 
        {
            clearTimeout(timeFn);
            //由于单击事件和双击事件冲突，故单击的响应事件延迟250毫秒执行
            timeFn = setTimeout(function(){
                var name = params.batch[0].name;
                var mapCode = cityMap[name];
                flag ++;
                if (!mapCode) {
                    alert('无此区域地图显示');
                    return;
                }
                if(flag%2 == 1)
                {
                    var businessData = param.provinceData;
                    getMap(mapCode, name, businessData);
                }else if(flag%2 == 0)
                {
                    var businessData = param.cityData;
                    getMap(mapCode, name, businessData);
                }
                //将上一级地图信息压入mapStack
                mapStack.push({
                    mapCode: curMap.mapCode,
                    mapName: curMap.mapName
                });
            }, 250);
        });
        /**
         绑定双击事件，并加载上一级地图
         */
        mapChart.on("dblclick", function(params) 
        {
            //当双击事件发生时，清除单击事件，仅响应双击事件
            clearTimeout(timeFn);
            var map = mapStack.pop();
            if (!mapStack.length && !map) {
                alert('已经到达最上一级地图了');
                return;
            }
            if(mapStack.length == 0)
            {
                var businessData = param.chinaData;
                getMap(map.mapCode, map.mapName, businessData);
            }
            else
            {
                var businessData = param.provinceData;
                getMap(map.mapCode, map.mapName, businessData);
            }

        });
    },
    /**
     * @param 业务数据
     * @divId echarts容器id
     * @options map参数对象
     * @该接口主要实现地图移动轨迹展示
     */
    _this.loadTrajectory = function(param,divId,options)
    {
        if(divId != "")
        {
            var mapChart = echarts.init(document.getElementById(divId));// 初始化echarts对象为mapChart
        }
        /*
        * 读取echarts Option配置数据
        */
        // echarts配置json文件的地址
        var optionUrl = path + "/config/trajectory_map.json";
        // 读取echartsoption配置
        $.get(optionUrl, function (option)
        {
            if(option != null)
            {
                mapOption = option;
                getMap(mapOption);
            }
        });
        /**
         * 读取geo地图数据并注入echarts api
         * @param mapOption
         */
        function getMap(mapOption)
        {
            mapChart.showLoading();// 数据加载项，增强用户体验
            // 地图json文件的地址
            var mapUrl = options.mapUrl;
            // 读取geo地图数据
            $.get(mapUrl, function (json)
            {
                if(json != null)
                {
                    if(options != null)
                    {
                        echarts.registerMap(options.mapName, json); // 注册地图
                        mapOption.geo.map = options.map; // 设置geo坐标系地图名称
                        mapOption.geo.zoom = options.zoom; // 设置地图缩放等级
                        mapOption.geo.center = options.center;// 设置地图中心点
                        mapOption.legend.data = options.legenddata;//图例data设置
                        mapOption.legend.selected = options.legendselected;//图例选中或不选中
                        mapOption.series[0].name = options.series0name;// 正常系列名称
                        mapOption.series[3].name = options.series3name;// 预测系列名称
                        mapOption.series[4].name = options.series4name;// 预测系列名称
                        mapOption.series[5].name = options.series5name;// 预测系列名称
                        mapOption.legend.top = options.legendtop;//图例y轴位置 上、中、下英文
                        mapOption.tooltip.formatter = options.displayContent;// 设置内容展示
                        mapOption.dataRange.show = options.dataRangeshow; // 设置隐藏或显示值域
                    }
                    if(param != null)
                    {
                        mapOption.series[0].data = param.linedata; // 设置特效线的渲染数据
                        mapOption.series[1].data = param.linedata; // 设置特效线的渲染数据
                        mapOption.series[2].data = param.pointdata;// 设置特效点的渲染数据
                        mapOption.series[3].data = param.predictlinedata; // 设置预测特效线的渲染数据
                        mapOption.series[4].data = param.predictlinedata; // 设置预测特效线的渲染数据
                        mapOption.series[5].data = param.predictpointdata;// 设置预测特效点的渲染数据
                    }
                    mapChart.setOption(mapOption);// 把加工好的mapOption注入echarts api
                    mapChart.hideLoading();// 数据加载项，增强用户体验
                }
            });
        }
    },
    /**
     * @param 业务数据
     * @divId echarts容器id
     * @options map参数对象
     * @该接口主要实现地图OD分析展示
     */
    _this.loadODanalysis = function(param,divId,options)
    {
        if(options.type == "O" || options.type == "")
        {
            // echarts配置json文件的地址
            var optionUrl = path + "/config/odanalysis_map.json";
            // 读取echartsoption配置
            $.get(optionUrl, function (option)
            {
                if(option != null)
                {
                    /**
                     * 组装系列O分析业务数据，并渲染到地图
                     */
                    if(param.geoCoordMap != null && param.obusinessdata.length > 0)
                    {
                        var dataItemO = []
                        var seriesOanalysis = [];
                        var convertData = function (data) {
                            var res = [];
                            for (var i = 0; i < data.length; i++) {
                                var dataItemO = data[i];
                                var fromCoord = param.geoCoordMap[dataItemO[0].name];
                                var toCoord = param.geoCoordMap[dataItemO[1].name];
                                if (fromCoord && toCoord) {
                                    res.push({
                                        fromName: dataItemO[0].name,
                                        toName: dataItemO[1].name,
                                        coords: [fromCoord, toCoord]
                                    });
                                }
                            }
                            return res;
                        };
                        var color = options.ocolor; // 切换业务数据所对应的渲染颜色
                        param.obusinessdata.forEach(function (item, i)//O分析业务数据处理
                        {
                            seriesOanalysis.push({
                                    name: item[0],
                                    type: 'lines',
                                    zlevel: 1,
                                    effect: { show: true, period: 6, trailLength: 0.7, color: '#fff', symbolSize: 3 },
                                    lineStyle:
                                    {
                                        normal: { color: color[i], width: 0, curveness: 0.2 }
                                    },
                                    data: convertData(item[1])
                                },
                                {
                                    name: item[0],
                                    type: 'lines',
                                    zlevel: 2,
                                    symbol: ['none', 'none'],
                                    symbolSize: 10,
                                    effect: { show: true, period: 6, trailLength: 0, symbol: "triangle", symbolSize: 8 },
                                    lineStyle:
                                    {
                                        normal: { color: color[i], width: 1, opacity: 0.6, curveness: 0.2 }
                                    },
                                    data: convertData(item[1])
                                },
                                {
                                    name: item[0],
                                    type: 'effectScatter',
                                    coordinateSystem: 'geo',
                                    zlevel: 2,
                                    rippleEffect: { brushType: 'stroke' },
                                    label:
                                    {
                                        normal: { show: true, position: 'right', formatter: '{b}' }
                                    },
                                    symbolSize: 10,
                                    itemStyle:
                                    {
                                        normal: { color: color[i] }
                                    },
                                    data: item[1].map(function (dataItemO) { return { name: dataItemO[1].name, value: geoCoordMap[dataItemO[1].name].concat([dataItemO[1].value]) };})
                                });
                        });
                    }
                    getOanalysisMap(option,seriesOanalysis);
                }
            });
            /**
             * 读取geo地图数据并注入echarts api
             * @param seriesOanalysis
             */
            function getOanalysisMap(option,seriesOanalysis)
            {
                if(divId.OdivId != "" && options.mapOanalysisUrl != "")
                {
                    var mapChart = echarts.init(document.getElementById(divId.OdivId));// 初始化echarts对象为mapChart
                    mapChart.showLoading();// 数据加载项，增强用户体验
                    var mapUrl = options.mapOanalysisUrl;// 地图json文件的地址
                }
                // 读取geo地图数据
                $.get(mapUrl, function (json)
                {
                    if(json != null)
                    {
                        if(options != null)
                        {
                            echarts.registerMap(options.omapName, json); // 注册地图
                            option.geo.map = options.omap; // 设置geo坐标系地图名称
                            option.geo.zoom = options.ozoom; // 设置地图缩放等级
                            option.geo.center = options.ocenter;// 设置地图中心点
                            option.legend.data = options.legendodata;//图例data设置
                            option.legend.top = options.legendotop;//图例y轴位置 上、中、下英文
                            option.tooltip.formatter = options.displayoContent;// 设置内容展示
                        }
                        option.series = seriesOanalysis;// 设置系列的动态生成系列值
                        mapChart.setOption(option);// 把加工好的mapOption注入echarts api
                        mapChart.hideLoading();// 数据加载项，增强用户体验
                    }
                });
            }
        }
        if(options.type == "D" || options.type == "")
        {
            // echarts配置json文件的地址
            var optionUrl = path + "/config/odanalysis_map.json";
            // 读取echartsoption配置
            $.get(optionUrl, function (option)
            {
                if(option != null)
                {
                    /**
                     * 组装系列D分析业务数据，并渲染到地图
                     */
                    if(param.geoCoordMap != null && param.dbusinessdata.length > 0)
                    {
                        var dataItemD = [];
                        var seriesDanalysis = [];
                        var convertData = function (data) {
                            var res = [];
                            for (var i = 0; i < data.length; i++) {
                                var dataItemD = data[i];
                                var fromCoord = param.geoCoordMap[dataItemD[0].name];
                                var toCoord = param.geoCoordMap[dataItemD[1].name];
                                if (fromCoord && toCoord) {
                                    res.push({
                                        fromName: dataItemD[0].name,
                                        toName: dataItemD[1].name,
                                        coords: [fromCoord, toCoord]
                                    });
                                }
                            }
                            return res;
                        };
                        var color = options.dcolor; // 切换业务数据所对应的渲染颜色
                        param.dbusinessdata.forEach(function (item, i)//D分析业务数据处理
                        {
                            seriesDanalysis.push({
                                    name: item[0],
                                    type: 'lines',
                                    zlevel: 1,
                                    effect: { show: true, period: 6, trailLength: 0.7, color: '#fff', symbolSize: 3 },
                                    lineStyle:
                                    {
                                        normal: { color: color[i], width: 0, curveness: 0.2 }
                                    },
                                    data: convertData(item[1])
                                },
                                {
                                    name: item[0],
                                    type: 'lines',
                                    zlevel: 2,
                                    symbol: ['none', 'none'],
                                    symbolSize: 10,
                                    effect: { show: true, period: 6, trailLength: 0, symbol: "triangle", symbolSize: 8 },
                                    lineStyle:
                                    {
                                        normal: { color: color[i], width: 1, opacity: 0.6, curveness: 0.2 }
                                    },
                                    data: convertData(item[1])
                                },
                                {
                                    name: item[0],
                                    type: 'effectScatter',
                                    coordinateSystem: 'geo',
                                    zlevel: 2,
                                    rippleEffect: { brushType: 'stroke' },
                                    label:
                                    {
                                        normal: { show: true, position: 'right', formatter: '{b}' }
                                    },
                                    symbolSize: 10,
                                    itemStyle:
                                    {
                                        normal: { color: color[i] }
                                    },
                                    data: item[1].map(function (dataItemD) { return { name: dataItemD[0].name, value: geoCoordMap[dataItemD[0].name].concat([dataItemD[0].value]) };})
                                });
                        });
                    }
                }
                getDanalysisMap(option,seriesDanalysis);
            });
            /**
             *  读取geo地图数据并注入echarts api
             * @param seriesDanalysis
             */
            function getDanalysisMap(option,seriesDanalysis)
            {
                if(divId.DdivId != "" && options.mapDanalysisUrl != "")
                {
                    var mapChart = echarts.init(document.getElementById(divId.DdivId));// 初始化echarts对象为mapChart
                    mapChart.showLoading();// 数据加载项，增强用户体验
                    var mapUrl = options.mapDanalysisUrl;// 地图json文件的地址
                }
                // 读取geo地图数据
                $.get(mapUrl, function (json)
                {
                    if(json != null)
                    {
                        if(options != null)
                        {
                            echarts.registerMap(options.dmapName, json); // 注册地图
                            option.geo.map = options.dmap; // 设置geo坐标系地图名称
                            option.geo.zoom = options.dzoom; // 设置地图缩放等级
                            option.geo.center = options.dcenter;// 设置地图中心点
                            option.legend.data = options.legendddata;//图例data设置
                            option.legend.top = options.legenddtop;//图例y轴位置 上、中、下英文
                            option.tooltip.formatter = options.displaydContent;// 设置内容展示
                        }
                        option.series = seriesDanalysis;// 设置系列的动态生成系列值
                        mapChart.setOption(option);// 把加工好的mapOption注入echarts api
                        mapChart.hideLoading();// 数据加载项，增强用户体验
                    }
                });
            }
        }
    };
};